Fix rm_rf on windows
authorAlex Crichton <alex@alexcrichton.com>
Wed, 25 Jun 2014 05:04:57 +0000 (22:04 -0700)
committerAlex Crichton <alex@alexcrichton.com>
Wed, 25 Jun 2014 18:12:56 +0000 (11:12 -0700)
Apparently git checkouts have objects in the database with permissions 444 which
need to be changed to something with a write permission before removal.

tests/support/paths.rs

index b42f5bd69a1ca8b05c2a788ca7a7c1d8fc7b15c1..99de20a2280e011fa85f3a7cd00cc4729cec7fbe 100644 (file)
@@ -33,9 +33,23 @@ impl PathExt for Path {
      */
     fn rm_rf(&self) -> IoResult<()> {
         if self.exists() {
+            // On windows, apparently git checks out the database with objects
+            // set to the permission 444, and apparently you can't unlink a file
+            // with permissions 444 because you don't have write permissions.
+            // Whow knew!
+            //
+            // If the rmdir fails due to a permission denied error, then go back
+            // and change everything to have write permissions, then remove
+            // everything.
+            match fs::rmdir_recursive(self) {
+                Err(io::IoError { kind: io::PermissionDenied, .. }) => {}
+                e => return e,
+            }
+            for path in try!(fs::walk_dir(self)) {
+                try!(fs::chmod(&path, io::UserRWX));
+            }
             fs::rmdir_recursive(self)
-        }
-        else {
+        } else {
             Ok(())
         }
     }